import logging
import os
import socket
from datetime import datetime

from rich.console import Console
from rich.logging import RichHandler
from rich.traceback import install

# 安装rich的traceback处理.
install(show_locals=True)

# 全局logger实例
_configured_loggers = {}


# 检测是否在PyCharm环境中运行
def _detect_pycharm():
    """检测是否在PyCharm环境中运行"""
    # 检查PyCharm相关的环境变量
    pycharm_env_vars = [
        'PYCHARM_HOSTED',
        'JETBRAINS_IDE',
        'PYCHARM_MATPLOTLIB_BACKEND',
        'PYCHARM_DISPLAY_PORT',
        'PYTHONIOENCODING'  # PyCharm通常设置这个
    ]

    # 检查是否有PyCharm相关的环境变量
    for var in pycharm_env_vars:
        if var in os.environ:
            return True

    # 检查环境变量值中是否包含pycharm
    for key, value in os.environ.items():
        if isinstance(value, str) and 'pycharm' in value.lower():
            return True
        if isinstance(key, str) and 'pycharm' in key.lower():
            return True

    # 检查是否在IDE环境中（通过sys模块）
    try:
        import sys
        # 检查是否有IDE相关的模块路径
        for path in sys.path:
            if 'pycharm' in path.lower() or 'jetbrains' in path.lower():
                return True
    except:
        pass

    return False


# 根据环境设置颜色系统
# 检查是否有强制颜色的环境变量
force_color = os.environ.get('FORCE_COLOR', '').lower() in ('1', 'true', 'yes')

if force_color or _detect_pycharm():
    # PyCharm环境或强制颜色：启用颜色
    color_system = "truecolor"
    force_terminal = True
else:
    # 其他环境：自动检测
    color_system = "auto"
    force_terminal = None

# 全局console实例 - 自适应宽度和颜色支持
console = Console(
    color_system=color_system,
    force_terminal=force_terminal,
    legacy_windows=False,
    soft_wrap=True  # 启用软换行，自动适应终端宽度
)

def getLog(name):
    """获取配置好的Rich logger实例"""
    # 如果已经配置过该名称的logger，直接返回
    if name in _configured_loggers:
        return _configured_loggers[name]

    # 创建logs目录（如果不存在）
    logs_dir = "logs"
    if not os.path.exists(logs_dir):
        os.makedirs(logs_dir)

    # 生成日志文件名（按日期、计算机名和模块名分离）
    current_date = datetime.now().strftime("%Y-%m-%d")
    computer_name = socket.gethostname()  # 获取计算机名作为标识

    # 根据logger名称决定日志文件名，实现日志分离
    if name in ['网络服务', 'Flask', 'werkzeug']:
        # Flask服务相关的日志
        log_filename = os.path.join(logs_dir, f"{current_date}_{computer_name}_Flask服务.log")
    elif name in ['历史单据测试纯后端', 'JF_SW_CER_PROCESS', 'JF_SW_CER']:
        log_filename = os.path.join(logs_dir, f"{current_date}_{computer_name}_历史单据测试纯后端.log")
    else:
        # 所有其他模块的日志都归入OCR程序日志
        log_filename = os.path.join(logs_dir, f"{current_date}_{computer_name}_OCR程序.log")

    # 根据环境配置日志格式和等级
    try:
        from 配置文件 import mode
        if mode == 'prod':
            # 生产环境：控制台显示INFO等级，文件保存DEBUG等级
            console_log_level = logging.INFO
            file_log_level = logging.DEBUG
            show_path = False
        else:
            # 开发环境：显示详细信息，日志等级为DEBUG
            console_log_level = logging.DEBUG
            file_log_level = logging.DEBUG
            show_path = True
    except ImportError:
        # 如果无法导入配置，使用开发环境格式
        console_log_level = logging.DEBUG
        file_log_level = logging.DEBUG
        show_path = True

    # 创建新的logger实例
    new_logger = logging.getLogger(name)
    new_logger.setLevel(logging.DEBUG)  # 设置logger的最低级别

    # 清除已有的handlers（避免重复添加）
    new_logger.handlers.clear()

    # 添加Rich控制台handler - 启用颜色和更好的格式
    rich_handler = RichHandler(
        console=console,
        show_time=True,
        show_level=True,
        show_path=show_path,
        markup=True,
        rich_tracebacks=True,
        tracebacks_show_locals=True,
        enable_link_path=False,
        keywords=[],
        log_time_format="[%X]"
    )
    rich_handler.setLevel(console_log_level)

    # 设置控制台日志格式
    if show_path:
        console_formatter = logging.Formatter(
            fmt="%(message)s",
            datefmt="[%X]"
        )
    else:
        console_formatter = logging.Formatter(
            fmt="%(message)s",
            datefmt="[%X]"
        )
    rich_handler.setFormatter(console_formatter)
    new_logger.addHandler(rich_handler)

    # 添加文件handler
    file_handler = logging.FileHandler(
        log_filename,
        encoding='utf-8'
    )
    file_handler.setLevel(file_log_level)

    # 设置文件日志格式
    file_formatter = logging.Formatter(
        fmt="%(asctime)s - %(name)s - %(levelname)s - %(funcName)s - %(message)s",
        datefmt="%m-%d %H:%M"
    )
    file_handler.setFormatter(file_formatter)
    new_logger.addHandler(file_handler)

    # 防止日志向上传播到root logger
    new_logger.propagate = False

    # 缓存配置好的logger
    _configured_loggers[name] = new_logger

    return new_logger
